package fr.uniscol.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import fr.uniscol.dao.IEleveDao;
import fr.uniscol.dao.IEnseignantDao;
import fr.uniscol.dao.IEtablissementDao;
import fr.uniscol.dao.IGeographieDao;
import fr.uniscol.dao.IGroupeDao;
import fr.uniscol.dao.IMatiereDao;
import fr.uniscol.dao.IServiceEnseignantDao;
import fr.uniscol.dao.IStructureDao;
import fr.uniscol.model.AnneeScolaire;
import fr.uniscol.model.Eleve;
import fr.uniscol.model.Enseignant;
import fr.uniscol.model.Etablissement;
import fr.uniscol.model.Matiere;
import fr.uniscol.model.Scolarite;
import fr.uniscol.model.ServiceEnseignant;
import fr.uniscol.model.Structure;
import fr.uniscol.model.StructureGroupe;
import fr.uniscol.service.IImportationFichierSiecleService;
import fr.uniscol.siecle.converters.CommuneSiecleConverter;
import fr.uniscol.siecle.converters.DepartementSiecleConverter;
import fr.uniscol.siecle.converters.DivisionSiecleConverter;
import fr.uniscol.siecle.converters.EleveSiecleConverter;
import fr.uniscol.siecle.converters.EnseignantSiecleConverter;
import fr.uniscol.siecle.converters.EtablissementSiecleConverter;
import fr.uniscol.siecle.converters.GroupeSiecleConverter;
import fr.uniscol.siecle.converters.IDonneeSiecleConverter;
import fr.uniscol.siecle.converters.MatiereSiecleConverter;
import fr.uniscol.siecle.converters.PaysSiecleConverter;
import fr.uniscol.siecle.converters.ServiceEnseignantSiecleConverter;
import fr.uniscol.siecle.model.Commune;
import fr.uniscol.siecle.model.Departement;
import fr.uniscol.siecle.model.Division;
import fr.uniscol.siecle.model.FichierExportSTSWeb;
import fr.uniscol.siecle.model.FichierExportSiecleCommuns;
import fr.uniscol.siecle.model.FichierExportSiecleEleves;
import fr.uniscol.siecle.model.FichierExportSiecleEtablissements;
import fr.uniscol.siecle.model.FichierExportSiecleGeographie;
import fr.uniscol.siecle.model.FichierExportSiecleStructures;
import fr.uniscol.siecle.model.Pays;
import fr.uniscol.siecle.model.Service;
import fr.uniscol.siecle.model.UAJ;

public class ImportationFichierSiecleService implements IImportationFichierSiecleService {

	private static Logger log = Logger.getLogger(ImportationFichierSiecleService.class);
	
	private PaysSiecleConverter paysConverter;
	private DepartementSiecleConverter departementConverter;
	private CommuneSiecleConverter communeConverter;
	private EtablissementSiecleConverter etablissementConverter;
	private DivisionSiecleConverter classeConverter;
	private GroupeSiecleConverter groupeConverter;
	private EnseignantSiecleConverter enseignantConverter;
	private ServiceEnseignantSiecleConverter serviceEnseignantConverter;
	private MatiereSiecleConverter matiereConverter;
	private EleveSiecleConverter eleveConverter;
	
	private IEtablissementDao etabDao;
	private IGeographieDao geoDao;
	private IEleveDao eleveDao;
	private IMatiereDao matiereDao;
	private IStructureDao structureDao;
	private IGroupeDao groupeDao;
	private IServiceEnseignantDao serviceDao;
	private IEnseignantDao enseignantDao;
	
	public void setEnseignantDao(IEnseignantDao enseignantDao) {
		this.enseignantDao = enseignantDao;
	}
	
	public void setServiceDao(IServiceEnseignantDao serviceDao) {
		this.serviceDao = serviceDao;
	}

	public void setGroupeDao(IGroupeDao groupeDao) {
		this.groupeDao = groupeDao;
	}

	public void setClasseDao(IStructureDao structureDao) {
		this.structureDao = structureDao;
	}

	public void setMatiereDao(IMatiereDao matiereDao) {
		this.matiereDao = matiereDao;
	}
	
	public void setEleveDao(IEleveDao eleveDao) {
		this.eleveDao = eleveDao;
	}
	
	public void setEtabDao(IEtablissementDao etabDao) {
		this.etabDao = etabDao;
	}
	
	public void setGeoDao(IGeographieDao geoDao) {
		this.geoDao = geoDao;
	}

	public void setPaysConverter(PaysSiecleConverter paysConverter) {
		this.paysConverter = paysConverter;
	}

	public void setDepartementConverter(
			DepartementSiecleConverter departementConverter) {
		this.departementConverter = departementConverter;
	}

	public void setCommuneConverter(CommuneSiecleConverter communeConverter) {
		this.communeConverter = communeConverter;
	}

	public void setEtablissementConverter(
			EtablissementSiecleConverter etablissementConverter) {
		this.etablissementConverter = etablissementConverter;
	}

	public void setClasseConverter(DivisionSiecleConverter classeConverter) {
		this.classeConverter = classeConverter;
	}

	public void setGroupeConverter(GroupeSiecleConverter groupeConverter) {
		this.groupeConverter = groupeConverter;
	}

	public void setEnseignantConverter(EnseignantSiecleConverter enseignantConverter) {
		this.enseignantConverter = enseignantConverter;
	}

	public void setServiceEnseignantConverter(
			ServiceEnseignantSiecleConverter serviceEnseignantConverter) {
		this.serviceEnseignantConverter = serviceEnseignantConverter;
	}

	public void setMatiereConverter(MatiereSiecleConverter matiereConverter) {
		this.matiereConverter = matiereConverter;
	}

	public void setEleveConverter(EleveSiecleConverter eleveConverter) {
		this.eleveConverter = eleveConverter;
	}

	@Transactional(readOnly=false)
	public void importerFichierSiecleCommuns(FichierExportSiecleCommuns communs) {
		Etablissement etab = null;
		IDonneeSiecleConverter converter = etablissementConverter;
		
		if(communs != null){
			etab = (Etablissement) converter.convertDonneeSiecle(communs.getUaj());
		}
		
		if(etab != null){
			etabDao.enregistrerEtablissement(etab);
		}
	}

	@Transactional(readOnly=false)
	public void importerFichierSiecleGeographie(FichierExportSiecleGeographie geographie) {
		List<fr.uniscol.model.geo.Pays> pays = new ArrayList<fr.uniscol.model.geo.Pays>();
		List<fr.uniscol.model.geo.Departement> departements = new ArrayList<fr.uniscol.model.geo.Departement>();
		List<fr.uniscol.model.geo.Commune> communes = new ArrayList<fr.uniscol.model.geo.Commune>();
		
		fr.uniscol.model.geo.Pays p = null;
		fr.uniscol.model.geo.Departement dep = null;
		fr.uniscol.model.geo.Commune com = null;
		
		for(Pays t : geographie.getPays()){
			p = (fr.uniscol.model.geo.Pays) paysConverter.convertDonneeSiecle(t);
			pays.add(p);
		}
		for(Departement d : geographie.getDepartements()){
			dep = (fr.uniscol.model.geo.Departement) departementConverter.convertDonneeSiecle(d);
			departements.add(dep);
		}
		for(Commune c : geographie.getCommunes()){
			com = (fr.uniscol.model.geo.Commune) communeConverter.convertDonneeSiecle(c);
			communes.add(com);
		}
		
		for(fr.uniscol.model.geo.Pays py : pays){
			geoDao.enregistrerPays(py);
		}
		for(fr.uniscol.model.geo.Departement d : departements){
			geoDao.enregistrerDepartement(d);
		}
		for(fr.uniscol.model.geo.Commune c : communes){
			geoDao.enregistrerCommune(c);
		}
	}

	@Transactional(readOnly=false)
	public void importerFichierSiecleStructures(FichierExportSiecleStructures structures) {
	}

	@Transactional(readOnly=false)
	public void importerFichierEtablissements(FichierExportSiecleEtablissements etablissements) {
		List<Etablissement> etabs = new ArrayList<Etablissement>();
		Etablissement etab = null;
		IDonneeSiecleConverter converter = etablissementConverter;
		
		for(UAJ uaj : etablissements.getEtablissements()){
			
			etab = (Etablissement) converter.convertDonneeSiecle(uaj);
			
			etabs.add(etab);
		}
		
		for(Etablissement e : etabs){
			etabDao.enregistrerEtablissement(e);
		}
	}

	@Transactional(readOnly=false)
	public void importerFichierSiecleEleves(FichierExportSiecleEleves eleves, AnneeScolaire annee) {
		
		List<Eleve> liste = new ArrayList<Eleve>();
		Eleve el = null;
		Scolarite scolarite = null;
		
		for(fr.uniscol.siecle.model.Eleve e : eleves.getEleves()){
			el = (Eleve) eleveConverter.convertDonneeSiecle(e);
			el.setAnneeScolaire(annee);
			if(!el.getScolarites().isEmpty()){
				scolarite = el.getScolarites().get(0);
				scolarite.setPeriode(annee.getPeriodeActive());
			}
			liste.add(el);
		}
		for(Eleve ele : liste){
			eleveDao.enregistrerEleve(ele);
		}
	}

	@Transactional(readOnly=false)
	public void importerFichierSiecleSTS(FichierExportSTSWeb sts) {
		AnneeScolaire annee = new AnneeScolaire(sts.getParametreAnnee());
		annee.setEtablissement(new Etablissement(sts.getParametreUaj(), ""));
		
		Map<String, Enseignant> mapEnseignants = new HashMap<String, Enseignant>();
		
		List<Matiere> matieres = new ArrayList<Matiere>();
		Matiere mat = null;
		for(fr.uniscol.siecle.model.Matiere m : sts.getMatieres()){
			mat = (Matiere) matiereConverter.convertDonneeSiecle(m);
			mat.setAnneeScolaire(annee);
			matieres.add(mat);
		}
		
		List<Structure> classes = new ArrayList<Structure>();
		Structure cl = null;
		for(Division div : sts.getDivisions()){
			cl = (Structure) classeConverter.convertDonneeSiecle(div);
			cl.setAnneeScolaire(annee);
			classes.add(cl);
		}
		
		List<StructureGroupe> groupes = new ArrayList<StructureGroupe>();
		StructureGroupe grp = null;
		for(fr.uniscol.siecle.model.Groupe g : sts.getGroupes()){
			grp = (StructureGroupe) groupeConverter.convertDonneeSiecle(g);
			grp.setAnneeScolaire(annee);
			groupes.add(grp);
		}
		
		List<Enseignant> enseignants = new ArrayList<Enseignant>();
		Enseignant ens = null;
		for(fr.uniscol.siecle.model.Enseignant e : sts.getEnseignants()){
			ens = (Enseignant) enseignantConverter.convertDonneeSiecle(e);
			ens.setAnneeScolaire(annee);
			enseignants.add(ens);
			
			mapEnseignants.put(ens.getId(), ens);
		}
		
		// Services
		List<ServiceEnseignant> services = new ArrayList<ServiceEnseignant>();
		ServiceEnseignant service = null;
		for(Service s : sts.getServices()){
			
			for(fr.uniscol.siecle.model.ServiceEnseignant se : s.getServicesEnseignant()){
				service = (ServiceEnseignant) serviceEnseignantConverter.convertDonneeSiecle(se);
				service.getEnseignant().setAnneeScolaire(annee);
				service.getMatiere().setAnneeScolaire(annee);
				service.getStructure().setAnneeScolaire(annee);
				services.add(service);
				
				ens = mapEnseignants.get(service.getEnseignant().getId());
				if(ens != null){
					ens.getServices().add(service);
				}
			}
		}
		
		for(Matiere m : matieres){
			matiereDao.enregistrerMatiere(m);
		}
		for(Structure st : classes){
			structureDao.enregistrerStructure(cl.getAnneeScolaire(), st);
		}
		for(StructureGroupe g : groupes){
			groupeDao.enregistrerGroupe(g);
		}
		for(Enseignant e : enseignants){
			enseignantDao.enregistrerEnseignant(e);
		}
		/*for(ServiceEnseignant s : services){
			serviceDao.enregistrerServiceEnseignant(s);
		}*/
	}
}
